4.2 正则表达式
1、从开始位置匹配
import re
t1=re.match( "apple","apple草果" ) #只能从第一个字符开始,如果不是,则返回none
t2=re.compile( "apple" ).match( "abapple草果" , 2 )
print (t1)
print (t2)
s1=re.fullmatch( "apple","apple草果" ) #完全匹配,如果不是,则返回none
s2=re.compile( "apple" ).fullmatch( "apple草果" ) #完全匹配,如果不是,则返回none
print (s1)
print (s2)
返回:
<re.Match object; span=(0, 5), match='apple'>
<re.Match object; span=(2, 7), match='apple'>
None
None
2、从任意位置开始匹配
Match()函数是必须从指定的起始位置开始匹配,如果希望从任意位置开始匹配,则可以使用search()函数, 如果匹配成功,则返回re.match对象
Match()和search()函数做匹配时,可能有多个符合匹配要求,但只返回第1个成功的re.match对象。
import re
t1=re.compile( "apple" ).search( "abapple苹果" )
print (t1)
s1=re.compile( "apple" )
s=s1.search( "234apple苹果apple" ) #只匹配第一个符合要求的字符串
print (s)
返回:
<re.Match object; span=(2, 7), match='apple'>
<re.Match object; span=(3, 8), match='apple'>
3、用列表存储匹配成功的值
前面学习的match()和search()函数只返回第1次匹配成功的re.match对象, 如果希望返回所有匹配成功的数据,可以使用findall()函数,返回的结果是列表类型, 如果没有匹配成功,则会返回空列表。
通过上面的示例发现,findall()函数如果没有分组,则直接返回匹配成功的所有字符串, 如果只有一个分组,则将分组中的值返回到列表,如果多于1个分组, 则列表中的每个元素是元组,而元组的元素则是每个分组的值
import re
text= "小张34小明16欧阳大明45小曾32"
t1=re.findall( "\D+\d+" ,text)
t2=re.findall( "(\D+)\d+" ,text)
t3=re.findall( "(\D+)(\d+)" ,text)
p=re.compile( "(\D+)(\d+)" )
s=p.findall(text, 5 )
print (t1)
print (t2)
print (t3)
print (s)
返回:
['小张34', '小明16', '欧阳大明45', '小曾32']
['小张', '小明', '欧阳大明', '小曾']
[('小张', '34'), ('小明', '16'), ('欧阳大明', '45'), ('小曾', '32')]
[('明', '16'), ('欧阳大明', '45'), ('小曾', '32')]
4、用迭代器存储匹配成功对象
Finditer()函数与findall()函数功能相似,区别在于findall()函数匹配成功后返回的是列表, 列表中存储是的匹配成功的数据,而finditer()函数匹配成功后返回的是迭代器, 并且迭代器中存储的民匹配成功的re.match对象。
Finditer()函数匹配成功后,可以用循环语句取出迭代器中的数据,也可以用list()函数对迭代数转换。
import re
text= "小张34小明16欧阳大明45小曾32"
p=re.compile( "(\D+)(\d+)" )
s=p.finditer(text)
for n in s:
print (n)
返回:
<re.Match object; span=(0, 4), match='小张34'>
<re.Match object; span=(4, 8), match='小明16'>
<re.Match object; span=(8, 14), match='欧阳大明45'>
<re.Match object; span=(14, 18), match='小曾32'>
1、 获取re.match对象的相关信息
可以返回re.match对象的函数有 match(),fullmatch(),search()以及findite()这4个函数
方法或属性 | 注释 |
---|---|
String | 被匹配的字符串 |
Re | 正则表达式的对象 |
Lastgroup | 返回最后一个分组的名字,没有产生匹配返回none |
Lastindex | 捕获组的最后分组索引值,相当于计算分组的组数,没有分组则返回 |
Endpos | 定位被匹配字符串的终点位置,可看做字符串长度 |
Pos | 定位被匹配字符串的起点位置,默认是0,用户如果重新指定起点位置,该属性则随之改变 |
Span([group]) | 返回匹配成功的字符串位置,返回一个二元组(起点,终点),span() |
和span(0)表示匹配的起始位置,也可以返回指定分组的起止位置, |
import re
text= "小张34小明16欧阳大明45小曾32"
p=re.compile( "(\D+)(\d+)" )
s=p.finditer(text,4)
for n in s:
print (n)
print ("--------")
print (n.span())
print (n.pos)
返回:
<re.Match object; span=(4, 8), match='小明16'>;
--------
(4, 8)
4
<re.Match object; span=(8, 14), match='欧阳大明45'>
--------
(8, 14)
4
<re.Match object; span=(14, 18), match='小曾32' >
--------
(14, 18)
4